import socket
import select

# 设置服务器IP和端口
host = '0.0.0.0'
port = 39000

# 创建服务器 Socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((host, port))
    s.listen(1)
    s.setblocking(False)  # 设置非阻塞模式
    print(f"Server listening on {host}:{port}...")

    inputs = [s]  # 可读的 sockets 列表

    while True:
        # 使用 select 来等待连接请求
        readable, _, _ = select.select(inputs, [], [])

        for sock in readable:
            if sock is s:
                # 新的客户端连接请求
                conn, addr = s.accept()
                print(f"Connection from {addr}")
                conn.setblocking(False)  # 设置非阻塞模式

                # 接收文件名的长度并获取文件名
                filename_len = int.from_bytes(conn.recv(4), byteorder='big')
                filename = conn.recv(filename_len).decode('utf-8')
                print(f"Receiving file: {filename}")

                # 接收文件大小
                file_size = int.from_bytes(conn.recv(4), byteorder='big')

                # 接收图片数据
                image_data = b''
                while len(image_data) < file_size:
                    image_data += conn.recv(1024)

                # 使用原始文件名保存图片
                with open(filename, 'wb') as f:
                    f.write(image_data)
                print(f"Image {filename} saved.")
                conn.close()
